package com.goldsprite.projecttemplategenerator;

import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.*;
import com.goldsprite.projecttemplategenerator.test.YamlUtils;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

import java.util.LinkedHashMap;
import java.util.Map;

public class YamlUIBuilder {

	private final Skin skin; // UI皮肤，用于生成LibGDX组件

	public YamlUIBuilder(Skin skin) {
		this.skin = skin;
	}

	/**
	 * 根据 YAML 数据动态生成键值对布局。
	 *
	 * @param yamlData YAML 数据（Map 格式）
	 * @return 包含所有键值对的 LibGDX Table 布局
	 */
	public Table buildLayout(Map<String, Object> yamlData) {
		Table rootTable = new Table();
		rootTable.top().left();
		createLayout(rootTable, yamlData, 0);
		return rootTable;
	}

	/**
	 * 递归解析 YAML 数据并生成布局。
	 *
	 * @param table  当前布局容器
	 * @param data   当前 YAML 数据
	 * @param indent 当前缩进级别
	 */
	private void createLayout(Table table, Map<String, Object> data, int indent) {
		for (Map.Entry<String, Object> entry : data.entrySet()) {
			String key = entry.getKey();
			Object value = entry.getValue();

			// 添加缩进
			String indentSpace = new String(new char[indent]).replace("\0", "  ");

			if (value instanceof String) {
				// 生成 Label 和 TextField 键值对
				Label keyLabel = new Label(indentSpace + key, skin);
				TextField valueField = new TextField((String) value, skin);
				valueField.setUserObject(keyLabel);

				table.add(keyLabel).left().pad(5);
				table.add(valueField).expandX().fillX().pad(5);
				table.row();
			} else if (value instanceof Map) {
				Map<String, Object> childMap = (Map<String, Object>) value;
				// 创建子布局
				Label sectionLabel = new Label(indentSpace + key + ":", skin);
				table.add(sectionLabel).left().expandX().fillX().pad(5).colspan(2);
				table.row();

				Table subTable = new Table();
				subTable.setUserObject(sectionLabel);
				subTable.left().top();
				createLayout(subTable, childMap, indent + 1);

				// 添加子布局到父布局
				table.add(subTable).expandX().fillX().colspan(2).left().padLeft(20).padTop(5);
				table.row();
			}
		}
	}

	/**
	 * 从 YAML 字符串加载数据并生成布局。
	 *
	 * @param yamlString YAML 格式的字符串
	 * @return 动态生成的键值对布局 Table
	 */
	public Table buildLayoutFromYamlString(String yamlString) {
		Yaml yaml = new Yaml(YamlUtils.getPrettyDumperOptions());
		Map<String, Object> yamlData = yaml.load(yamlString);
		return buildLayout(yamlData);
	}

	/**
	 * 递归解析布局并收集用户输入数据，更新到配置 Map 中。
	 *
	 * @param formTable  当前表单容器
	 * @param configData 当前配置数据的 Map
	 */
	public void collectConfigData(WidgetGroup formTable, Map<String, Object> configData) {
		for (Actor actor : formTable.getChildren()) {
			if (actor instanceof TextField) {
				// 获取 TextField 的用户对象作为键路径
				TextField textField = (TextField) actor;
				Label keyLabel = (Label) textField.getUserObject();
				String key = keyLabel.getText().toString().trim();
				Object value = textField.getText();
				configData.put(key, value);
			} else if (actor instanceof WidgetGroup) {
				// 如果是嵌套的 Table，递归解析其子组件
				WidgetGroup subTable = (WidgetGroup) actor;

				// 根据子表格的关联标签名找到对应的子 Map
				Label sectionLabel = (Label) subTable.getUserObject();
				String sectionKey = sectionLabel.getText().toString().trim().replace(":", "");

				// 确保子 Map 存在
				Map<String, Object> childMap = (Map<String, Object>) configData.getOrDefault(sectionKey, new LinkedHashMap<>());
				configData.put(sectionKey, childMap);

				// 递归解析子表格
				collectConfigData(subTable, childMap);
			}
		}
	}

}
